# 问答题：
#     面向对象三大特点是什么，并说出每一个特点是什么
#     重写是什么，为什么要重写，重写后又想用父类的同名方法怎么办？
#
#

# 封装，把属于哪个的属性和功能封装到哪个类中，从而简化主程序代码逻辑，使主程序逻辑更清晰代码更简单
# 继承，子类可以继承父类的属性和方法，根据自己的特性定义新的属性和方法，通过继承可以减少重复的代码
# 多态，继承自相同基类的子类在运行时各自拥有各自的表现，特点主要体现在架构设计上，父类设计者可以根据逻辑编写父类的代码，
#       以及框架根据父类做相应的控制逻辑，而不需要关心子类具体的表现形式
# 重写，当父类定义的方法不足以满足子类的需要，子类可以对父类的方法进行扩展或改写，重写后通过super().方法名()的形式类调用父类的方法

# 练习1，编写一段代码以完成下面的要求
#        1. 定义一个Person类,类中要有初始化方法,方法中要有人的姓名和年龄属性
#        2. 将类中的姓名是公有属性，年龄是私有属性.
#        3. 提供获取私有属性的公有方法 get_age方法.
#        4. 提供可以设置私有属性的方法 set_age方法，要求如果输入的年龄在 0 -- 100 之间，设置年龄，否则，提示输入不正确，.
#        5. 重写 __str__ 要求打印对象时，把 姓名和年龄都打印出来。


class Person:

    def __init__(self, name, age):
        self.name = name
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if 0 < age < 100:
            self.__age = age
        else:
            print("输入不正确")

    def __str__(self):
        return "姓名:%s, 年龄:%d" % (self.name, self.__age)


#
# 练习 2.使用类属性、类方法、静态方法的知识实现以下功能：
# 		小明，小花，小刚，做游戏， 每个人都有一个分数(1 -- 100)，
# 		游戏开始前，显示，“游戏开始了，各位加油啊”
# 		游戏进行中打印每个人的游戏分数
# 		游戏结束后，打印最高分

class Person:
    max_name = ""
    max_score = 0

    def __init__(self, name):
        self.name = name
        self.score = 0

    def __str__(self):
        return "[%s]的分数是[%d]" % (self.name, self.score)

    def add_score(self, score):
        self.score += score
        if self.score > Person.max_score:
            Person.max_score = self.score
            Person.max_name = self.name

    @classmethod
    def print_score_max(cls):
        if cls.max_score > 0:
            print("[%s]分数最高，分数为[%d]" % (cls.max_name, cls.max_score))
        else:
            print("没有产生最高分")


xiaoming = Person("小明")
xiaohua = Person("小花")
xiaogang = Person("小刚")

print("游戏开始了，各位加油啊")

xiaoming.add_score(10)
xiaohua.add_score(20)
xiaogang.add_score(30)
xiaoming.add_score(20)
xiaoming.add_score(1)
Person.print_score_max()


